package com.htgd.gardenexpo.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.htgd.gardenexpo.dao.GeConIntegralCategoryDao;
import com.htgd.gardenexpo.dao.WxUserCouponDao;
import com.htgd.gardenexpo.entity.GeConCoupon;
import com.htgd.gardenexpo.dao.GeConCouponDao;
import com.htgd.gardenexpo.entity.GeConIntegralGet;
import com.htgd.gardenexpo.entity.WxUserCoupon;
import com.htgd.gardenexpo.page.CouponQuery;
import com.htgd.gardenexpo.page.PageBase;
import com.htgd.gardenexpo.service.GeConCouponService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.htgd.gardenexpo.vo.CouponCenterVO;
import com.htgd.gardenexpo.vo.GeConCouponVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 优惠券 服务实现类
 * </p>
 *
 * @author author
 * @since 2024-06-24
 */
@Service
public class GeConCouponServiceImpl extends ServiceImpl<GeConCouponDao, GeConCoupon> implements GeConCouponService {

    @Autowired
    private GeConCouponDao geConCouponDao;

    @Autowired
    private WxUserCouponDao wxUserCouponDao;

    @Autowired
    private GeConIntegralCategoryDao geConIntegralCategoryDao;

    @Override
    public PageInfo<GeConCouponVO> querylist(CouponQuery couponQuery) {
        List<GeConCouponVO> geConCouponVOS = new ArrayList<>();

        PageHelper.startPage(couponQuery.getPageNum(),couponQuery.getPageSize());
        List<GeConCoupon> list = geConCouponDao.querylist(couponQuery);
        for (GeConCoupon geConCoupon : list) {
            GeConCouponVO geConCouponVO = new GeConCouponVO();
            BeanUtils.copyProperties(geConCoupon,geConCouponVO);
            //使用条件
            if(geConCouponVO.getConditionType()==0){
                geConCouponVO.setConditionText("无条件");
            }else {
                geConCouponVO.setConditionText("满"+geConCouponVO.getReductionAmount()+"元可用");
            }
            //使用时间
            if(geConCouponVO.getValidityType()==1){
                geConCouponVO.setTimeText("长期有效");
            }else if(geConCouponVO.getValidityType()==2){
                geConCouponVO.setTimeText("领取后"+geConCouponVO.getFixedDays()+"天内有效");
            }else {
                geConCouponVO.setTimeText(geConCouponVO.getFixedTime().plusDays(1)+"之前有效");
            }
            //类目
            String categoryName = geConIntegralCategoryDao.getNameById(geConCouponVO.getCategoryId());
            geConCouponVO.setCategoryName(categoryName);
            geConCouponVOS.add(geConCouponVO);
        }
        return new PageInfo<>(geConCouponVOS);
    }

    @Override
    public void changeStatus(GeConCoupon geConCoupon) {
        lambdaUpdate().eq(GeConCoupon::getId,geConCoupon.getId())
                .set(GeConCoupon::getStatus,geConCoupon.getStatus())
                .update();
    }

    @Override
    public void addCirculation(GeConCoupon geConCoupon) {
        UpdateWrapper<GeConCoupon> userUpdateWrapper = new UpdateWrapper<>();

        // 设置更新条件为 id 等于 geConCoupon 的 id
        userUpdateWrapper.eq("id", geConCoupon.getId())

                // 使用 Lambda 表达式更新 circulation 字段
                .setSql("circulation = circulation + " + geConCoupon.getCirculation());

        // 执行更新操作
        geConCouponDao.update(null, userUpdateWrapper);

    }

    @Override
    public PageInfo<CouponCenterVO> couponCenter(String openId, PageBase pageBase) {
        PageHelper.startPage(pageBase.getPageNum(),pageBase.getPageSize());
        List<CouponCenterVO> couponCenterVOS = geConCouponDao.couponCenter();
        for (CouponCenterVO couponCenterVO : couponCenterVOS) {
            //使用条件
            if(couponCenterVO.getConditionType()==0){
                couponCenterVO.setConditionText("无条件");
            }else {
                couponCenterVO.setConditionText("满"+couponCenterVO.getReductionAmount()+"元可用");
            }
            //类目
            String categoryName = geConIntegralCategoryDao.getNameById(couponCenterVO.getCategoryId());
            couponCenterVO.setCategoryName(categoryName);

            //使用时间
            if(couponCenterVO.getValidityType()==1){
                couponCenterVO.setTimeText("长期有效");
            }else if(couponCenterVO.getValidityType()==2){
                couponCenterVO.setTimeText("领取后"+couponCenterVO.getFixedDays()+"天内有效");
            }else {
                couponCenterVO.setTimeText(couponCenterVO.getFixedTime().plusDays(1)+"之前有效");
            }

            //发行量
            Integer num = wxUserCouponDao.getById(couponCenterVO.getId());
            if(couponCenterVO.getCirculation()<=num){
                couponCenterVO.setCouponStatus("2");
            }else {
                List<WxUserCoupon> wxUserCoupon = wxUserCouponDao.getByIdAndOpenId(openId,couponCenterVO.getId());
                if(wxUserCoupon!=null){
                    if(wxUserCoupon.size()>=couponCenterVO.getLimitAmount()){
                        couponCenterVO.setCouponStatus("1");
                    }else {
                        couponCenterVO.setCouponStatus("0");
                    }
                }else {
                    couponCenterVO.setCouponStatus("0");
                }
            }
        }
        return new PageInfo<>(couponCenterVOS);
    }
}
